package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ICompanySysNoticeDAO;
import org.jsola.hr.dto.CompanySysNoticeAddDTO;
import org.jsola.hr.dto.CompanySysNoticeOfflineDTO;
import org.jsola.hr.dto.CompanySysNoticeUpdateDTO;
import org.jsola.hr.entity.CompanySysNoticeDO;
import org.jsola.hr.query.CompanySysNoticeQuery;
import org.jsola.hr.vo.CompanySysNoticeListVO;
import org.jsola.hr.vo.CompanySysNoticeVO;
import org.jsola.hr.vo.UserCompanySysNoticeListVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 公司系统公告信息
 *
 * @author zhr
 */
public interface ICompanySysNoticeService extends IService<ICompanySysNoticeDAO, CompanySysNoticeDO> {

    /**
     * 新增公司系统公告信息
     *
     * @param companySysNoticeAddDTO 新增公司系统公告信息DTO
     * @param tokenUser              当前用户
     * @return 公司系统公告信息详情信息
     */
    CompanySysNoticeVO save(CompanySysNoticeAddDTO companySysNoticeAddDTO, TokenUser tokenUser);

    /**
     * 修改公司系统公告信息
     *
     * @param companySysNoticeUpdateDTO 修改公司系统公告信息DTO
     * @param tokenUser                 当前用户
     * @return 更新数量
     */
    int update(CompanySysNoticeUpdateDTO companySysNoticeUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除公司系统公告信息，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser           当前用户
     * @param companySysNoticeIds 公司系统公告信息id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... companySysNoticeIds);

    /**
     * 根据公司系统公告信息id查找
     *
     * @param companySysNoticeId 公司系统公告信息id
     * @param tokenUser          当前用户
     * @return 公司系统公告信息详情信息
     */
    CompanySysNoticeVO selectById(String companySysNoticeId, TokenUser tokenUser);

    /**
     * 查询公司系统公告信息
     *
     * @param companySysNoticeQuery 查询条件
     * @param siteId                所属站点id
     * @return 公司系统公告信息列表信息
     */
    List<CompanySysNoticeListVO> select(CompanySysNoticeQuery companySysNoticeQuery, String siteId);

    /**
     * 查询公司系统公告信息记录数
     *
     * @param companySysNoticeQuery 查询条件
     * @param siteId                所属站点id
     * @return 公司系统公告信息记录数
     */
    int selectCount(CompanySysNoticeQuery companySysNoticeQuery, String siteId);

    /**
     * 分页查询公司系统公告信息
     *
     * @param companySysNoticeQuery 查询条件
     * @param siteId                所属站点id
     * @return 公司系统公告信息列表信息
     */
    Page<CompanySysNoticeListVO> selectPage(CompanySysNoticeQuery companySysNoticeQuery, String siteId);


    /**
     * 根据公司系统公告信息id查找
     *
     * @param companySysNoticeId 公司系统公告信息id
     * @param siteId             所属站点id
     * @return 公司系统公告信息
     */
    CompanySysNoticeDO selectDOById(String companySysNoticeId, String siteId);

    /**
     * 查询公司系统公告信息
     *
     * @param companySysNoticeQuery 查询条件
     * @param siteId                所属站点id
     * @return 公司系统公告信息列表
     */
    List<CompanySysNoticeDO> selectDO(CompanySysNoticeQuery companySysNoticeQuery, String siteId);

    /**
     * 上线公司公告
     *
     * @param companySysNoticeId 公司系统公告信息id
     * @param tokenUser          当前用户
     */
    void onlineNotice(String companySysNoticeId, TokenUser tokenUser);

    /**
     * 置顶公告
     *
     * @param companySysNoticeId 公司系统公告信息id
     * @param tokenUser          当前用户
     */
    void topNotice(String companySysNoticeId, TokenUser tokenUser);

    /**
     * 取消置顶公告
     *
     * @param companySysNoticeId 公司系统公告信息id
     * @param tokenUser          当前用户
     */
    void upTopNotice(String companySysNoticeId, TokenUser tokenUser);

    /**
     * 下线公司公告
     *
     * @param companySysNoticeId 公司系统公告信息id
     * @param offlineDTO         下线公告的参数
     * @param tokenUser          当前用户
     */
    void offlineNotice(String companySysNoticeId, CompanySysNoticeOfflineDTO offlineDTO, TokenUser tokenUser);

    /**
     * 运行上线操作
     *
     * @param id        公告id
     * @param tokenUser 当前用户
     */
    void runOnline(String id, TokenUser tokenUser);

    /**
     * 运行下线操作
     *
     * @param id        公告id
     * @param tokenUser 当前用户
     */
    void runOffline(String id, TokenUser tokenUser);

    /**
     * 获取当前用户可见的公司公告
     *
     * @param companySysNoticeQuery 查询条件
     * @param tokenUser             当前用户
     * @return 前用户可见的公司公告
     */
    List<UserCompanySysNoticeListVO> listSysNoticeByUser(CompanySysNoticeQuery companySysNoticeQuery, TokenUser tokenUser);

    /**
     * 获取当前用户可见的公司公告,分页展示
     *
     * @param companySysNoticeQuery 查询条件
     * @param tokenUser             当前用户
     * @return 前用户可见的公司公告
     */
    Page<UserCompanySysNoticeListVO> pageSysNoticeByUser(CompanySysNoticeQuery companySysNoticeQuery, TokenUser tokenUser);

    /**
     * 根据id查询系统公告
     *
     * @param sysNoticeId 系统公告id
     * @param tokenUser   当前用户
     * @return 系统公告信息
     */
    UserCompanySysNoticeListVO findSysNoticeByUser(String sysNoticeId, TokenUser tokenUser);

    /**
     * 根据公告id获取用户有权限的公告
     *
     * @param siteId       站点
     * @param sysNoticeIds 公司公告id
     * @return 用户有权限的公告
     */
    List<CompanySysNoticeDO> listBySysNoticeIds(String siteId, String... sysNoticeIds);

    /**
     * 微信通知测试
     *
     * @param tokenUser
     */
    void sendMessageTest(TokenUser tokenUser);

    /**
     *
     * @param tokenUser
     */
    void sendMessageTestNoJump(TokenUser tokenUser);
}


